package com.zy.design.demo.behavioral;

/**
 * 命令模式
 * 特点：将请求封装成对象，以便参数化不同的请求、队列请求和日志请求。
 * 命令模式更关注行为的请求和执行，将请求与逻辑解耦。
 */
// 定义命令接口
interface Command {
    void execute();
}

// 接收者（具体实现行为）
class Light1 {
    public void turnOn() {
        System.out.println("灯打开了");
    }

    public void turnOff() {
        System.out.println("灯关闭了");
    }
}

// 具体命令：打开灯
class TurnOnLightCommand implements Command {
    private Light1 light;

    public TurnOnLightCommand(Light1 light) {
        this.light = light;
    }
    public void execute() {
        light.turnOn(); // 调用接收者行为
    }
}

// 具体命令：关闭灯
class TurnOffLightCommand implements Command {
    private Light1 light;

    public TurnOffLightCommand(Light1 light) {
        this.light = light;
    }
    public void execute() {
        light.turnOff(); // 调用接收者行为
    }
}

// 调用者（请求者）：遥控器
class RemoteControl {
    private Command command;

    // 设置命令
    public void setCommand(Command command) {
        this.command = command;
    }

    // 执行命令
    public void pressButton() {
        command.execute();
    }
}

class Main5 {
    public static void main(String[] args) {
        Light1 light = new Light1(); // 接收者
        Command turnOn = new TurnOnLightCommand(light); // 打开灯命令
        Command turnOff = new TurnOffLightCommand(light); // 关闭灯命令

        RemoteControl remote = new RemoteControl(); // 遥控器
        remote.setCommand(turnOn); // 设置命令
        remote.pressButton(); // 执行命令：灯打开了

        remote.setCommand(turnOff); // 更换命令
        remote.pressButton(); // 执行命令：灯关闭了
    }
}
/**
 对比点	        命令模式	                            状态模式
 目的	        解耦调用者和接收者，封装请求为对象	    管理状态，随着状态变化调整对象行为
 关注点	        行为请求的封装（执行什么操作）	    对象状态的变化及其行为
 对象间的关系	请求者（调用者）和接收者解耦	        状态和上下文对象（状态拥有者）的关系
 应用场景	    需要将行为请求保存、排队、撤销等	    对象行为依赖状态变化
 */